

package com.hazelcast.internal.partition.membergroup;

import com.hazelcast.config.PartitionGroupConfig;
import com.hazelcast.spi.discovery.integration.DiscoveryService;

public final class MemberGroupFactoryFactory {

    private MemberGroupFactoryFactory() {
    }

    public static MemberGroupFactory newMemberGroupFactory(PartitionGroupConfig partitionGroupConfig, DiscoveryService discoveryService) {
        PartitionGroupConfig.MemberGroupType memberGroupType;

        if (partitionGroupConfig == null || !partitionGroupConfig.isEnabled()) {
            memberGroupType = PartitionGroupConfig.MemberGroupType.PER_MEMBER;
        } else {
            memberGroupType = partitionGroupConfig.getGroupType();
        }

        switch (memberGroupType) {
        case HOST_AWARE:
            return new HostAwareMemberGroupFactory();
        case CUSTOM:
            return new ConfigMemberGroupFactory(partitionGroupConfig.getMemberGroupConfigs());
        case PER_MEMBER:
            return new SingleMemberGroupFactory();
        case ZONE_AWARE:
            return new ZoneAwareMemberGroupFactory();
        case NODE_AWARE:
            return new NodeAwareMemberGroupFactory();
        case PLACEMENT_AWARE:
            return new PlacementAwareMemberGroupFactory();
        case SPI:
            return new SPIAwareMemberGroupFactory(discoveryService);
        default:
            throw new RuntimeException("Unknown MemberGroupType:" + memberGroupType);
        }
    }
}
